package com.aaa.sys.service.impl;

import cn.hutool.core.util.StrUtil;
import com.aaa.sys.entity.User;
import com.aaa.sys.dao.UserDao;
import com.aaa.sys.service.UserService;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.ResultStatus;
import com.aaa.common.vo.Page;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;


import javax.annotation.Resource;
import java.util.List;

/**
 * 用户信息表(User)表服务实现类
 *
 * @author makejava
 * @since 2023-06-16 14:30:58
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao userDao;

    /**
     * 更新用户权限表，删除用户
     * @param userId
     * @return
     */
    @Transactional
    @Override
    public String updateDelFlag(Integer userId) {
        this.deleteRoleIdsByUserId(userId);
        if (this.deleteById(userId)){
            return "删除成功!";
        }
        return "删除失败!";
    }

    /**
     * 根据用户id删除权限
     * @param userId
     * @return
     */
    @Override
    public int deleteRoleIdsByUserId(Integer userId) {
        return userDao.deleteRoleIdsByUserId(userId);
    }

    /**
     * 批次插入用户和权限信息
     * @param userId
     * @param roleIds
     * @return
     */
    @Transactional  //保证该方法中调用的所有方法一期提交或者一起回滚
    @Override
    public int batchInsertUserRole(Integer userId, String roleIds) {
        this.deleteRoleIdsByUserId(userId);
        //2.再添加关联
        //添加是否成功标识符
        boolean flag = true;

        //判断menuIds是否为空 不为空时  进行 分割 添加 操作
        if(StrUtil.isNotEmpty(roleIds)){
            //进行分割为数组
            String[] ids = roleIds.split(",");
            //循环数组
            for (String id : ids) {
                //调用batchInsertRoleMenu方法进行添加所选的menuId进行添加
                int sucNum = userDao.batchInsertUserRole(userId, Integer.valueOf(id));
                if (sucNum<1){
                    //说明调用失败
                    flag=false;
                }
            }
        }
        //如果循环添加结束，flag仍然是true说明 全部成功
        if(flag){
            return 1;
        }
        return 0;
    }

    /**
     * 根据用户名查询用户信息
     * @param userName
     * @return
     */
    @Override
    public User queryByUserName(String userName) {
        //实例化参数user
        User user = new User();
        user.setUserName(userName);
        user.setStatus("0");
        user.setDelFlag("0");
        //查询
        List<User> userList = userDao.queryAllByLimit(user);
        //判断集合是否为null  引用的是spring提供的集合工具类
        if (!CollectionUtils.isEmpty(userList)){
            //获取第一个元素
            return userList.get(0);
        }

        return null;
    }

    /**
     * 通过ID查询单条数据
     *
     * @param userId 主键
     * @return 实例对象
     */
    @Override
    public User queryById(Integer userId) {
        return this.userDao.queryById(userId);
    }

    /**
     * 分页查询
     *
     * @param page 筛选条件
     * @return 查询结果
     */
    @Override
    public PageInfo queryByPage(Page<User> page) {
        //分页操作  分页参数一定要进行传递
        if (page == null || page.getPageNo() == null || page.getPageNo() == 0 || page.getPageSize() == null || page.getPageSize() == 0) {
            //进行业务编写时，可以抛出自定义异常
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMsg());
        }
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //获取查询对象
        User user = page.getData();
        return new PageInfo(userDao.queryAllByLimit(user));
    }

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public User insert(User user) {
        this.userDao.insert(user);
        return user;
    }

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public User update(User user) {
        this.userDao.update(user);
        return this.queryById(user.getUserId());
    }

    /**
     * 通过主键删除数据
     *
     * @param userId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer userId) {
        return this.userDao.deleteById(userId) > 0;
    }
}
